﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FastTravel.DataAccess.Interface;
using FastTravel.DB;
using FastTravel.DB.Enums;
using StructureMap;

namespace FastTravel.BusinessLogic
{
	/// <summary>
	/// Класс для управления историей заказов
	/// </summary>
	public class OrderHistoryManager
	{
		/// <summary>
		/// Хранилище заказов
		/// </summary>
		private static IRepository<OrderHistory> OrderHistoryRepository
		{
			get { return ObjectFactory.GetInstance<IRepository<OrderHistory>>(); }
		}

		/// <summary>
		/// Создать запись в истории
		/// </summary>
		/// <param name="actionType">Тип действия</param>
		/// <param name="desciption">Описание</param>
		/// <param name="login">Имя пользователя</param>
		/// <returns>Запись в истории</returns>
		public static OrderHistory Add(ActionType actionType, string desciption, string login)
		{
			if (!string.IsNullOrWhiteSpace(login))
			{
				var orderHistory = new OrderHistory
				                   	{
				                   		ActionDate = DateTime.Now,
				                   		ActionType = actionType,
				                   		Description = desciption,
				                   		UserName = login
				                   	};

				OrderHistoryRepository.Add(orderHistory);
				return orderHistory;
			}
			return null;
		}

		/// <summary>
		/// Получить запись в истории
		/// </summary>
		/// <param name="id">ID записи</param>
		/// <returns>Запись</returns>
		public static OrderHistory Get(int id)
		{
			return OrderHistoryRepository.Single(x => x.ID == id);
		}

		/// <summary>
		///  Получить страницу записей в истории
		/// </summary>
		/// <param name="start">Начальная страница</param>
		/// <param name="limit">Размер страницы</param>
		/// <param name="sort">Сортировка по полю</param>
		/// <param name="dir">Направление сортировки</param>
		/// <param name="count">Общее число записей</param>
		/// <returns>Список записей</returns>
		public static List<OrderHistory> GetPage(int start, int limit, string sort, string dir, out int count)
		{
			return OrderHistoryRepository.GetPage(start, limit, sort, dir, out count);
		}

		/// <summary>
		/// Получить все записи заказа
		/// </summary>
		/// <returns>Список записей</returns>
		public static IEnumerable<OrderHistory> GetAll(int orderId)
		{
			return OrderHistoryRepository.GetQuery().Where(x => x.Order.ID == orderId);
		}

		/// <summary>
		/// Получить общее количество записей
		/// </summary>
		/// <returns>Количество записей</returns>
		public static int Count(int orderId)
		{
			return OrderHistoryRepository.GetQuery().Where(x => x.Order.ID == orderId).Count();
		}

		/// <summary>
		/// Удалить запись из истории заказов:)
		/// </summary>
		/// <param name="id">ID</param>
		public static void Delete(int id)
		{
			OrderHistory orderHistory = OrderHistoryRepository.Single(x => x.ID == id);
			if (orderHistory != null)
			{
				OrderHistoryRepository.Delete(orderHistory);
			}
		}
	}
}
